EventBridgeなどの他のサービス経由で EC2 インスタンスが起動できない事象への対応方法
困っていること
EventBridge スケジューラを用いて定時に EC2 を起動する仕組みを作りました。
しかし、EventBridge スケジューラの実行時刻になっても、EC2 が起動されませんでした。
EvenrBridge スケジューラの実行ロールには EC2 を Start する許可がある IAM ポリシーが付与されています。
EC2 にアタッチされている EBS は暗号化されています。
解決方法を教えてください。
どう解決すればいいの?
EC2 にアタッチされている EBS が KMS キー(カスタマーマネージドキー)で暗号化されている場合、他のサービスを用いて EC2 を起動する際に 他のサービスが用いる IAM ロールに KMS キーを復号化する IAM ポリシーが必要です。
そのため、EventBridge の実行ロールに下記の権限が必要となります。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:ReEncrypt*", "kms:Encrypt", "kms:GenerateDataKey*", "kms:DescribeKey", "kms:CreateGrant" ], "Resource": "arn:aws:kms:<region>:<AccountID>:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ] }
やってみた
EC2 インスタンスを作成します。作成時に、ルートボリュームをカスタマーマネージドキーで暗号化します。
EventBridge Scheduler で EC2 を起動するスケジュールを作成し、実行ロールに AWS 管理ポリシーの EC2FullAccess
を付与します。
スケジュールが実行されましたが、インスタンスが起動されていませんでした。CloudTrail には下記の記録が残っていました。
{ "eventVersion": "1.09", "userIdentity": { "type": "AssumedRole", "principalId": "AROASAMPLESAMPLESAMPL:SAMPLESAMPLESAMPLESAMPLE", "arn": "arn:aws:sts::<AccountID>:assumed-role/ScheduleRoleFullAccess/SAMPLESAMPLESAMPLESAMPLE", "accountId": "<AccountID>", "accessKeyId": "ASIASAMPLESAMPLESAMPL", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "AROASAMPLESAMPLESAMPL", "arn": "arn:aws:iam::<AccountID>:role/ScheduleRoleFullAccess", "accountId": "<AccountID>", "userName": "ScheduleRoleFullAccess" }, "attributes": { "creationDate": "2024-01-09T01:29:23Z", "mfaAuthenticated": "false" } } }, "eventTime": "2024-01-09T01:29:23Z", "eventSource": "ec2.amazonaws.com", "eventName": "StartInstances", "awsRegion": "ap-northeast-1", "sourceIPAddress": "123.123.123.123", "userAgent": "AmazonEventBridgeScheduler, aws-sdk-java/2.22.10 Linux/5.10.201-191.748.amzn2.x86_64 OpenJDK_64-Bit_Server_VM/17.0.9+13-LTS Java/17.0.9 kotlin/1.6.21-release-334(1.6.21) vendor/Amazon.com_Inc. md/internal exec-env/AWS_ECS_FARGATE io/async http/NettyNio cfg/retry-mode/legacy", "requestParameters": { "instancesSet": { "items": [ { "instanceId": "i-<instanceid>" } ] } }, "responseElements": { "requestId": "6b0db447-abcd-1234-abcd-1234567890ab", "instancesSet": { "items": [ { "instanceId": "i-<instanceid>", "currentState": { "code": 0, "name": "pending" }, "previousState": { "code": 80, "name": "stopped" } } ] } }, "requestID": "6b0db447-abcd-1234-abcd-1234567890ab", "eventID": "6ec420f5-abcd-1234-abcd-1234567890ab", "readOnly": false, "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "<AccountID>", "eventCategory": "Management", "tlsDetails": { "tlsVersion": "TLSv1.2", "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256", "clientProvidedHostHeader": "ec2.ap-northeast-1.amazonaws.com" } }
EC2 インスタンスの状態が stopped
から pending
に変化していますが、マネジメントコンソールでは stopped
に戻っていました。
カスタマーマネージドキーで暗号化された EBS ボリュームがアタッチされた EC2 は、管理ポリシー EC2FullAccess
では不足していることが分かりました。
では、EventBridge Scheduler の実行ロールにカスタマーマネージドキーへのアクセス権限を付与します。
スケジュールの実行後、インスタンスが起動されたことが確認できました。
参考資料
EventBridgeスケジューラを使ってEC2の定期起動/停止を行う方法 | DevelopersIO
暗号化されたボリュームがアタッチされた状態でインスタンスを起動すると、インスタンスはすぐに停止します | AWS re:Post